利用extension简化代码
Swift 减少了冗余度,因为枚举值可以在类型名之后加上点语法进行访问,即使你省略掉了类型姓名它仍然能够推断出来:
label.textAlignment = NSTextAlignment.Center
// 更为简洁:
label.textAlignment = .Center
然而,很多时候我们很可能不会用到枚举,遇上的往往是这样很长很长的一个构造器:
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
代码中会有多少个“timingFunction”?很可能多到无法想象。
有一个不为人知的小技巧,就是缩略形式的点语法对于所有类型的静态成员来说都是有效的。通过在扩展中增加自定义的属性就可以应用上这个技巧了……
extension CAMediaTimingFunction
{
// 这个属性是懒加载属性,第一次被访问时才会被初始化。
// (@nonobjc 标记是必须的,这可以阻止编译器试图为一个
// 静态属性创建动态访问器(也就是令其不可继承)。
@nonobjc static let EaseInEaseOut = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
// 另一个方法就是使用计算性属性,这也同样有效,
// 但是*每次*访问它的时候都将重新计算,可能带来性能问题:
static var EaseInEaseOut: CAMediaTimingFunction {
// .init is short for self.init
return .init(name: kCAMediaTimingFunctionEaseInEaseOut)
}
}
这样我们就可以很方便地简化这个操作了:
animation.timingFunction = .EaseInEaseOut
上下文环境 处理 Core Graphics 上下文、色区之类的代码同样也会非常非常长:
CGContextSetFillColorWithColor(UIGraphicsGetCurrentContext(),
CGColorCreate(CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB), [0.792, 0.792, 0.816, 1]))
我们仍然使用万能的扩展:
extension CGContext
{
static func currentContext() -> CGContext? {
return UIGraphicsGetCurrentContext()
}
}
extension CGColorSpace
{
static let GenericRGB = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB)
}
CGContextSetFillColorWithColor(.currentContext(),
CGColorCreate(.GenericRGB, [0.792, 0.792, 0.816, 1]))
看起来要简单不少。当然,还有很多方法可以扩展 Core Graphics,从而让它符合您的需求。